package q29_divide;

public class Solution_1 {
    public static void main(String[] args) {
        // System.out.println(divide(2147483647,2));
        System.out.println(div(-20,-3));
    }

    public static int divide(int dividend, int divisor) {
        // 已经规定除数不为零

        // 如果除数是1，可以直接返回
        if(divisor == 1) return dividend;

        // 特殊的溢出情况
        if(divisor == -1 && dividend == Integer.MIN_VALUE){
            return Integer.MAX_VALUE; // 溢出
        }

        // flag标志，由于之后的方法要将除数与被除数都转换为负数（负数位比正数能多保证不容易溢出）
        boolean flag = true;
        if((dividend > 0 && divisor < 0)||(dividend < 0 && divisor > 0))
            flag = false;

        int a = dividend>0 ? -dividend : dividend;
        int b = divisor>0 ? -divisor : divisor;

        if(a > b) return 0;
        int res = div(a,b);


        return flag?res:-res;
    }

    // 利用反复相加来判断除数的一种方法
    private static int div(int a, int b) {
        if (a > b){
            return 0;
        }
        int count = 1;
        int db = b;
        while((db + db > a)&&(db + db < 0)){
            count += count;
            db += db;
        }
        return count + div(a - db,b);

    }
}
